iT邦幫忙

2021 iThome 鐵人賽

DAY 13
0
Modern Web

每日1%,你會累趴。系列 第 13

Day13 Docker compose

  • 分享至 

  • xImage
  •  

當每個Class(Image)都寫的簡潔有力又好用、且權責都分得乾乾淨淨的時候就可以加入一個Service層讓整個服務更容易地被使用,而這個Service層的功能就由docker-compose來擔任,先建立一個資料夾然後按照下圖將檔案建立好。

.
├── Backend
│   ├── index.php
│   ├── Dockerfile
│   └── nginx
│       └── default.conf
└── docker-compose.yaml

default.conf這個檔案內容為以下

server {
    listen 80;
    index index.php index.html;
    server_name localhost;
    error_log  /var/log/nginx/error.log;
    access_log /var/log/nginx/access.log;
    root /var/www/daythirteen;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass php:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
}

default.conf這個檔案是屬於Nginx的設定,Nginx是一套與Apache相似的服務,負責處理網頁的request與response,在本篇章就不多敘述。

index.php 內容為以下

<?php
echo 'Hello World';
?>

docker-compose 內容為以下

version: '3'
networks: 
  laravel:
services: 
  nginx:
    image: nginx:stable-alpine
    container_name: nginx-laravel
    ports:
      - "8080:80"
    volumes:
      - ./Backend/index.php:/var/www/daythirteen/index.php
      - ./Backend/nginx/default.conf:/etc/nginx/conf.d/default.conf
    depends_on:
      - php
      - postgresql
    networks:
      - laravel
  php:
    image: kurt6783/iron_man
    container_name: php
    ports:
      - "9000:9000"
    volumes:
      - ./Backend/index.php:/var/www/daythirteen/index.php
    networks:
      - laravel
  postgresql:
    image: mdillon/postgis:10
    container_name: postgresql
    tty: true
    ports:
      - "5432:5432"
    environment:
      - POSTGRES_PASSWORD=1234
    volumes:
      - ./Backend/postgresql:/var/lib/postgresql/data
    networks: 
      - laravel

下面說明一些重要的屬性。

  1. networks

前面有提到每一個實體化的container都是一個獨立的個體,但因為Nginx、php、postgresql這三個服務是需要串起來才能發揮功用的,所以需要利用networks來讓他們建立一個內網,可以看到在每個服務的下面都會搭配一個networks屬性。

  1. image

功能如其名,container要由哪一個image實體化就是從這裡設定,PHP的部分就是使用昨天製作的Image

  1. build,可與image屬性交換使用,可即時build一個Image,缺點就是比較花時間,DockerFile的內容可參考Day12 Docker File
build:
      context: .
      dockerfile: ./Backend/Dockerfile
  1. container_name

替這個實例化的container取一個名字,方便辨識、取log、關閉、重啟。

  1. ports

開一個port讓外部可以連入,例如Day11的SQL就是用此方法讓Navicate可以連線的。

  1. volumes

從外部掛載檔案到內部,冒號左邊為外部位置,冒號右邊為內部位置,啟動時會將資料掛載進去container,運行中即關閉時會將資料同步至外部,如果沒有掛載檔案的話當container關閉後在期間有變化的檔案就不會有紀錄。

  1. depends_on

必須要先啟動指定container才能繼續實體化該container,以此案例來說,如果要啟用Nginx必須要先啟用php與postgresql,畢竟不可能沒有廚師跟服務生還開門做生意。

  1. environment

環境變數設定,與Day11 SQL下指令的 -e 是同一個指令,每個Image有屬於自己的環境參數設定,可至DockerHub上查詢。


要使用docker-compose是需要安裝軟體的,所以打開terminal打上

curl -L "https://github.com/docker/compose/releases/download/1.10.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compos

替docker-compose設定操作權限

chmod +x /usr/local/bin/docker-compose

確定是否有安裝成功

docker-compose -v

查詢docker-compose 有哪些服務

docker-compose -h

最後就是三個最常用的docker-compose 指令。

  1. 打開terminal移動至與docker-compose同層級或是更下層都可以,下完指令後會依序往上層直到搜尋到docker-compose檔案為止啟動該docker-compose設定內的所有服務,-d代表該服務運行於後台不佔用terminal
docker-compose up -d
  1. 關閉該docker-compose設定內的所有服務
docker-compose down
  1. 列表目前啟用中的container
docker ps

只要利用docker ps 確認container皆有順利運行的話就可利用Chrome打上localhost:8080或是127.0.0.1:8080即可確認服務成功運行了(8080port是因為Ningx設定的外部port為8080)。
https://ithelp.ithome.com.tw/upload/images/20210913/20115048jYgKFISHLR.png

這次的Docker介紹就到這邊告一段落了,謝謝觀看的各位,請記得按讚分享開啟小鈴鐺,你的支持會讓按讚數+1。


上一篇
Day12 Docker File
下一篇
Day14 突如其來的Minecraft
系列文
每日1%,你會累趴。30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言